﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SEG.Model;
using Common.DataAccess;

namespace SEG.DataAccess.DataAccess
{
    public class AdministrarGruposDataAccess : GenericEntityManagerDataAccess<Grupo, AdministrarGruposCriteria, AdministrarGruposView, SEGContext>
    {
        protected override Grupo ReadEntity(Guid id)
        {
            return ObjectContext.Grupos.
                Include("Permiso").
                Include("Permiso.Formulario").
                Include("Permiso.Accion").
                Where(grupo => grupo.ID_Grupo == id).
                FirstOrDefault();
        }

        public override List<AdministrarGruposView> Read(AdministrarGruposCriteria criteria)
        {
            return ObjectContext.Grupos.
                Where(grupo => (String.IsNullOrEmpty(criteria.Nombre) || grupo.Nombre.Contains(criteria.Nombre)) &&
                                 (String.IsNullOrEmpty(criteria.Codigo) || grupo.Codigo.Contains(criteria.Codigo))).
                Select(grupo => new AdministrarGruposView
                {
                    ID = grupo.ID_Grupo,
                    Codigo = grupo.Codigo,
                    EstaActivo = grupo.EstaActivo,
                    Nombre = grupo.Nombre
                }).OrderBy(c => c.Codigo).ToList();
        }

        public override List<Grupo> ReadEntities()
        {
            var list = ObjectContext.Grupos.
                Where(g => g.EstaActivo).
                OrderBy(g => g.Codigo).ToList();
            return list;
        }

        public override void Save(Grupo entity)
        {
            this.ValidateCodigoGrupo(entity);
            base.Save(entity);
        }

        private void ValidateCodigoGrupo(Grupo entity)
        {
            if (ObjectContext.Grupos.Any(g => g.Codigo.ToUpper() == entity.Codigo.ToUpper() && g.ID_Grupo != entity.ID_Grupo))
            {
                throw new Exception("Ya existe un grupo con el código de grupo ingresado.");
            }
        }
    }
}
